/*
 * Mysql-backed implementation of the album interface.
 * Needs the following table:
 * 
 * CREATE TABLE  `webdb`.`album` (
 * `ID` int(10) unsigned NOT NULL auto_increment,
 * `titolo` varchar(200) NOT NULL,
 * `IDutente` int(10) unsigned NOT NULL,
 * `pubblico` char(1) NOT NULL default 'n',
 * PRIMARY KEY  (`ID`)
 * );
 * 
 */
package it.univaq.f4i.iw.ex.album.model.impl;

import it.univaq.f4i.iw.ex.album.model.Album;
import it.univaq.f4i.iw.ex.album.model.Photo;
import it.univaq.f4i.iw.ex.album.model.User;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

/**
 *
 * @author Giuseppe Della Penna
 */
public class AlbumMysqlImpl implements Album {

    private String title;
    private boolean isPublic;
    private List<Photo> photos;
    private User owner;
    private int key;
    //proprietà non esposte dall'interfaccia, usate solo per questa implementazione
    //these properties are not available to the user, but only to the implementation
    //chiave esterna verso il record dell'utente proprietario
    //foreign key to the owner record
    private int user_key;
    //riferimento dal data layer che gestisce questo modello dati
    //reference to the data layer that handles this data model
    private PhotoAlbumDataLayerMysqlImpl datalayer;

    //notare che i costruttori che seguono sono entrambi
    //package-private, cioè possono essere richiamati
    //solo da classi all'interno dello stesso package
    //(tra cui le API del modello dati), ma risultano
    //invisibili all'utente (che non può usare quindi la
    //new per creare istanze di questa classe)
    //costrutture "vuoto" usato per inizializzare gli oggetti
    //notare che queste classi hanno bisogno di un riferimento
    //alle API del modello dati per eseguire alcune operazioni
    // note that following constructors are
    // package-private, i.e., they can be called
    // only by classes in the same package
    // (including the data layer class), but are
    // invisible to the user (the operator new cannot be
    // used to create instances of this class)
    //  this is an "empty" constructor 
    // note that these classes need a reference
    // to the data layer API to perform some operations
    AlbumMysqlImpl(PhotoAlbumDataLayerMysqlImpl datalayer) {
        title = "";
        isPublic = false;
        photos = null;
        owner = null;
        key = 0;
        user_key = 0;
        this.datalayer = datalayer;
    }

    //costrutture "helper" che crea un oggetto e lo imposta
    //in base ai valori dei campi nel record corrente di
    //un ResultSet - utile per creare oggetti a partire
    //dai risultati di una query
    //helper constructor which creates an object
    //and sets its contents according to the fields
    //of the current record in the given ResultSet - 
    //useful to create objects from query results
    AlbumMysqlImpl(PhotoAlbumDataLayerMysqlImpl datalayer, ResultSet data) throws SQLException {
        this.datalayer = datalayer;
        key = data.getInt("ID");
        title = data.getString("titolo");
        isPublic = data.getBoolean("pubblico");
        user_key = data.getInt("IDutente");
        photos = null;
        owner = null;
    }

    /**
     * @return the title
     */
    public String getTitle() {
        return title;
    }

    /**
     * @param title the title to set
     */
    public void setTitle(String title) {
        this.title = title;
    }

    /**
     * @return the isPublic
     */
    public boolean isPublic() {
        return isPublic;
    }

    /**
     * @param isPublic the isPublic to set
     */
    public void setPublic(boolean isPublic) {
        this.isPublic = isPublic;
    }

    /**
     * @return the photos
     */
    //questo getter implementa una politica di
    //caricamento "lazy" delle foto aggregate
    //(il caricamento avviene alla prima chiamata
    //al metodo)
    //this getter implements a "lazy loading" policy
    //for the linked photos: the photos for this
    //album are loaded only when this method is first called
    public List<Photo> getPhotos() {
        if (photos == null) {
            photos = datalayer.getPhotoByAlbum(this);
        }
        return photos;
    }

    /**
     * @param photos the photos to set
     */
    public void setFoto(List<Photo> photos) {
        this.photos = photos;
    }

    /**
     * @return the owner
     */
    //questo getter implementa una politica di
    //caricamento "lazy" del'utente aggregato
    //(il caricamento avviene alla prima chiamata
    //al metodo)
    //this getter implements a "lazy loading" policy
    //for the linked user: it is loaded 
    //only when this method is first called
    public User getOwnerUser() {
        if (owner == null) {
            owner = datalayer.getUser(user_key);
        }
        return owner;
    }

    /**
     * @param owner the owner to set
     */
    public void setOwnerUser(User owner) {
        this.owner = owner;
    }

    /**
     * @return the key
     */
    public int getKey() {
        return key;
    }

    /**
     * @param key the key to set
     */
    public void setKey(int key) {
        this.key = key;
    }
}
